// 播放状态
const isPlaying = ref(false);

// 当前播放时间
const currentTime = ref(0);

// 总时长
const duration = ref(0);

let musicEhdCallback = null;

// 音频实例
const innerAudioContext = ref<UniApp.InnerAudioContext>(null);


export default function useAction() {
  /** 初始化音频 */
  const initAudio = () => {
    if (innerAudioContext.value) {
      return;
    }

    innerAudioContext.value = uni.createInnerAudioContext()

    // 监听播放事件
    innerAudioContext.value.onPlay(() => {
      isPlaying.value = true
      updateDuration()
    })

    // 监听暂停事件
    innerAudioContext.value.onPause(() => {
      isPlaying.value = false
    })

    // 播放进度更新事件
    innerAudioContext.value.onTimeUpdate(() => {
      currentTime.value = innerAudioContext.value!.currentTime
    })

    // 播放结束事件
    innerAudioContext.value.onEnded(() => {
      isPlaying.value = false
      currentTime.value = 0
      if (musicEhdCallback) {
        musicEhdCallback();
      }
    })

    // 错误事件
    innerAudioContext.value.onError((res) => {
      console.error('音频播放错误:', res)
      uni.showToast({ title: '播放失败', icon: 'none' })
    })
  }

  /** 切换歌曲 */
  function changeMusic(playUrl: string) {
    if (!innerAudioContext.value) return;

    if (innerAudioContext.value.src === playUrl) return;

    if (isPlaying.value) {
      togglePlay();
    }
    innerAudioContext.value.src = playUrl;
    updateDuration()

  }

  /** 进度条拖动事件
   * */
  function sliderChange(e: { detail: { value: number } }) {
    innerAudioContext.value!.seek(e.detail.value)
  }

  /** 获取总时长 */
  const updateDuration = () => {
    setTimeout(() => {
      duration.value = innerAudioContext.value!.duration
    }, 500)
  }

  /** 切换播放状态 */
  const togglePlay = () => {
    if (!innerAudioContext.value || !innerAudioContext.value.src) return;
    if (isPlaying.value) {
      innerAudioContext.value.pause()
    } else {
      innerAudioContext.value.play()
    }
    isPlaying.value = !isPlaying.value
  }

  /** 格式化时间
   * @param seconds 秒数
   * */
  const formatTime = (seconds: number) => {
    const minutes = Math.floor(seconds / 60)
    const secs = Math.floor(seconds % 60)
    return `${minutes}:${secs.toString().padStart(2, '0')}`
  }

  /** 销毁音频 */
  function destroyAudio() {
    if (innerAudioContext.value) {
      innerAudioContext.value.destroy()
      innerAudioContext.value = null
    }
  }

  /** 音乐播放结束 */
  function musicEnded(ehdCallback: () => void) {
    musicEhdCallback = ehdCallback;
  }

  return {
    innerAudioContext,
    isPlaying,
    currentTime,
    duration,
    initAudio,
    changeMusic,
    sliderChange,
    togglePlay,
    formatTime,
    destroyAudio,
    musicEnded,
  }
}